#ifndef SQL_OPERATOR_H
#define SQL_OPERATOR_H

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QHash>
#include <QList>
#include <QVariant>
#include <QString>

/**
 * @brief 数据库操作类，封装了SQLite数据库的常用操作
 * 提供连接管理、表结构操作、数据增删改查等功能
 * 特别支持查询任意表中的任意值并返回结果
 */
class SqlOperator {
public:
    bool createTable(const QString &tableName, const QHash<QString, QString> &fields, const QList<QString> &pks);
    /**
     * @brief 构造函数
     */
    SqlOperator();

    /**
     * @brief 打开数据库连接
     * @param dbName 数据库文件路径
     * @param connectName 连接名称，用于区分多个数据库连接
     * @return 成功返回true，失败返回false
     */
    bool open(const QString &dbName, const QString &connectName = "default");

    /**
     * @brief 关闭数据库连接
     */
    void close();

    /**
     * @brief 获取当前连接名称
     * @return 连接名称字符串
     */
    QString getConnectName() const;

    /**
     * @brief 检查表是否存在
     * @param tableName 表名
     * @return 存在返回true，不存在返回false
     */
    bool isExistTable(const QString &tableName);

    /**
     * @brief 创建数据表
     * @param tableName 表名
     * @param fields 字段名和类型的哈希表，如{"id": "INTEGER", "name": "TEXT"}
     * @param pks 主键字段列表
     * @return 成功返回true，失败返回false
     */
    bool createTable1(const QString &tableName, const QMap<QString, QString> &fields, const QList<QString> &pks);
    /**
     * @brief 查询表中所有数据
     * @param tableName 表名
     * @param fields 需要查询的字段列表
     * @param data 输出参数，存储查询结果
     * @return 成功返回true，失败返回false
     */
    bool selectData(const QString &tableName, const QList<QString> &fields, QList<QVariantList> &data);

    /**
     * @brief 带条件查询表中数据
     * @param tableName 表名
     * @param fields 需要查询的字段列表
     * @param whereConditions 查询条件哈希表，如{"id": 1, "name": "test"}
     * @param data 输出参数，存储查询结果
     * @return 成功返回true，失败返回false
     */
    bool selectData(const QString &tableName, const QList<QString> &fields,
                   const QHash<QString, QVariant> &whereConditions, QList<QVariantList> &data);
    bool selectData1(const QString &tableName, const QList<QString> &fields,
                       const QMap<QString, QVariant> &whereConditions, QList<QVariantList> &data);
    /**
     * @brief 执行自定义SQL语句查询
     * @param sql 自定义SQL查询语句
     * @param fields 需要提取的字段列表
     * @param data 输出参数，存储查询结果
     * @return 成功返回true，失败返回false
     */
    bool selectDataBySql(const QString &sql, const QList<QString> &fields, QList<QVariantList> &data);

    /**
     * @brief 获取表中符合条件的单个值
     * @param tableName 表名
     * @param targetField 需要返回的目标字段名
     * @param whereConditions 查询条件哈希表
     * @return 成功返回查询到的值(QVariant)，失败返回无效的QVariant
     */
    QVariant getSingleValue(const QString &tableName, const QString &targetField,
                           const QHash<QString, QVariant> &whereConditions);

    /**
     * @brief 插入单行数据
     * @param tableName 表名
     * @param fields 字段列表
     * @param data 对应字段的值列表
     * @return 成功返回true，失败返回false
     */
    bool insertRowData(const QString &tableName, const QList<QString> &fields, const QVariantList &data);

    /**
     * @brief 插入多行数据
     * @param tableName 表名
     * @param fields 字段列表
     * @param data 多行数据，每行是一个QVariantList
     * @return 成功返回true，失败返回false
     */
    bool insertRowsData(const QString &tableName, const QList<QString> &fields, const QList<QVariantList> &data);

    /**
     * @brief 更新数据
     * @param tableName 表名
     * @param data 需要更新的字段和值的哈希表
     * @param whereConditions 更新条件哈希表
     * @return 成功返回true，失败返回false
     */
    bool updateData(const QString &tableName, const QHash<QString, QVariant> &data,
                   const QHash<QString, QVariant> &whereConditions);

    /**
     * @brief 删除数据
     * @param tableName 表名
     * @param whereConditions 删除条件哈希表
     * @return 成功返回true，失败返回false
     */
    bool deleteData(const QString &tableName, const QHash<QString, QVariant> &whereConditions);

    /**
     * @brief 执行SQL语句
     * @param sql 要执行的SQL语句
     * @return 成功返回true，失败返回false
     */
    bool exec(const QString &sql);

    /**
     * @brief 检查数据库是否支持事务
     * @return 支持返回true，不支持返回false
     */
    bool hasTransactions();

    /**
     * @brief 开始事务
     * @return 成功返回true，失败返回false
     */
    bool transaction();

    /**
     * @brief 提交事务
     * @return 成功返回true，失败返回false
     */
    bool commit();

    /**
     * @brief 回滚事务
     * @return 成功返回true，失败返回false
     */
    bool rollback();

    /**
     * @brief 获取查询结果的记录数
     * @return 记录数，-1表示获取失败
     */
    int size();

    /**
     * @brief 获取表的字段信息
     * @param tableName 表名
     * @param fieldsName 输出参数，存储字段名列表
     * @return 成功返回true，失败返回false
     */
    bool getTableFieldsInfo(const QString &tableName, QList<QString> &fieldsName);

    /**
     * @brief 获取最后执行的SQL语句
     * @return SQL语句字符串
     */
    QString lastQuerySql();

    /**
     * @brief 获取最后发生的错误信息
     * @return 错误信息字符串
     */
    QString lastError() const;

    int getrandomgear(int legth);
    int getrandomoster(int legth);
private:
    /**
     * @brief 检查表和字段是否存在
     * @param tableName 表名
     * @param fields 需要检查的字段列表
     * @return 都存在返回true，否则返回false
     */
    bool checkTableInfo(const QString &tableName, const QList<QString> &fields);

    QSqlDatabase m_db;      // 数据库连接对象
    QSqlQuery m_query;      // SQL查询对象
    QString m_connectName;  // 连接名称
    QString m_lastError;    // 最后错误信息

};

#endif // SQL_OPERATOR_H
